package com.fengkai.filepost.pdfoutstream.test.ODsolutions;

import java.util.Arrays;
import java.util.LinkedList;

/**
 * @author Fengkai
 * @creat 2023/4/13
 * 流水线
 * 题目
 * 一个工厂有 m 条流水线，来并行完成 n 个独立的作业，该工厂设置了一个调度系统，在安排作业时，总是优先执行处理时间最短的作业。
 * 现给定流水线个数 m，需要完成的作业数 n, 每个作业的处理时间分别为 t1,t2…tn。请你编程计算处理完所有作业的耗时为多少？
 * 当 n>m 时，首先处理时间短的 m 个作业进入流水线，其他的等待，当某个作业完成时，依次从剩余作业中取处理时间最短的进入处理。
 * 输入描述:
 * 第一行为 2 个整数（采用空格分隔），分别表示流水线个数 m 和作业数 n；
 * 第二行输入 n 个整数（采用空格分隔），表示每个作业的处理时长 t1,t2…tn。
 */
public class WaterLine {

    public static void main (String[] args) {

        System.out.println(getMinTime(5, 5, new int[]{8, 4, 2, 2, 8}));
    }

    public static int getMinTime (int m, int n, int[] costs) {
        if (costs.length != n) {
            return -1;
        }
        Arrays.sort(costs);
        LinkedList<Integer> integers = new LinkedList<>();
        for (int i = 0; i < costs.length; i++) {
            integers.add(costs[i]);
        }
        int[] ints = new int[m];
        for (int i = 0; i < m; i++) {
            ints[i] = integers.removeFirst();
        }
        int count = 0;
        while (true) {
            for (int i = 0; i < ints.length; i++) {
                ints[i] = --ints[i];
                if (ints[i] <= 0 && integers.size() > 0) {
                    ints[i] = integers.removeFirst();
                } else if (ints[i] <= 0 && integers.size() == 0) {
                    ints[i] = 0;
                }
            }
            count++;
            if (integers.size() == 0) {
                if (Arrays.stream(ints).max().getAsInt() == 0) {
                    break;
                }
            }
        }
        return count;
    }
}
